/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import persistence.SessionManager;

import model.*;
import security.ActivationKey;
import util.DateHelper;

/**
 *
 * @author Niels Leguit <niels.leguit at hva.nl>
 * @version $Id: MijnBeheer_FillDBController.java,v 1.0 2012/05/01 $
 */
public class MijnBeheer_FillDBController extends HttpServlet {
    
    Session session = null;
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    DateFormat tf = new SimpleDateFormat("hh:mm");
    Date datum = null;
    Date tijd = null;
      
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    

        // This step will read hibernate.cfg.xml and prepare hibernate for use
        session = SessionManager.openSession();
        Transaction tx = session.beginTransaction();        
        
        try {   
            
            System.out.println("Inserting rollen Records");
            //Create new instance of Rol and set values in it by creating a rol with createRol
            Rol r = createRol("Gast", "Gast account", false, false, false);
            r = createRol("Gebruiker", "Gebruikers account", false, false, true);
            r = createRol("Adverteerder", "Adverteerder account", true, false, false);          
            r = createRol("Beheerder", "Beheer account", false, true, false);           
            r = createRol("Admin", "Admin account", true, true, true);
 
            System.out.println("Inserting Leden Records");
            //Create new instance of Lid and set values in it by creating a lid with createLid
            Lid l = createLid(2, "gebr001", "Dummy 1", DateHelper.toDate("01/01/1999"), "Noord-Holland");         // rol 2
            l = createLid(2, "gebr002", "Dummy 2", DateHelper.toDate("01/02/1999"), "Zuid-Holland");              // rol 2
            l = createLid(2, "gebr003", "Dummy 3", DateHelper.toDate("01/03/1999"), "Utrecht");                   // rol 2
            l = createLid(2, "gebr004", "Dummy 4", DateHelper.toDate("01/04/1999"), "Noord-Holland");             // rol 2
            l = createLid(5, "niels", "Niels", DateHelper.toDate("01/05/1999"), "Flevoland");                     // rol 5
            l = createLid(5, "Johan", "Johan", DateHelper.toDate("01/06/1999"), "Noord-Holland");                 // rol 5
            l = createLid(5, "drona", "Drona", DateHelper.toDate("01/07/1999"), "Noord-Holland");                 // rol 5
            l = createLid(5, "sujen", "Sujen", DateHelper.toDate("01/08/1999"), "Noord-Holland");                 // rol 5
            l = createLid(1, "gast", "Gast", DateHelper.toDate("01/09/1999"), "Noord-Holland");                   // rol 1      
            l = createLid(2, "gebruiker", "Gebruiker", DateHelper.toDate("01/10/1999"), "Noord-Holland");         // rol 2
            l = createLid(3, "adverteerder", "Adverteerder", DateHelper.toDate("01/11/1999"), "Noord-Holland");   // rol 3
            l = createLid(4, "beheerder", "Beheerder", DateHelper.toDate("01/12/1999"), "Noord-Holland");         // rol 4
            l = createLid(5, "admin", "Admin", DateHelper.toDate("01/01/2000"), "Noord-Holland");                 // rol 5

            System.out.println("Inserting Rit Records");
            //Create new instance of Rit and set values in it by creating a rit with createRit
            Rit rt = createRit(1, DateHelper.toDate("01/04/2012"), DateHelper.toTime("12:00"), "Amstersdam", "Diemen", 1, true, true, true);
            rt = createRit(2, DateHelper.toDate("05/02/2012"), DateHelper.toTime("17:30"), "Lelystad", "Enkhuizen", 1, true, true, false);
            rt = createRit(3, DateHelper.toDate("06/03/2012"), DateHelper.toTime("05:00"), "Hoorn", "Den-Helder", 1, true, false, true);
            rt = createRit(4, DateHelper.toDate("07/04/2012"), DateHelper.toTime("00:00"), "Maastricht", "Groningen", 1, false, true, false);
            rt = createRit(1, DateHelper.toDate("08/05/2012"), DateHelper.toTime("00:00"), "Baarn", "Amersfoort", 1, false, false, false);
            
            System.out.println("Inserting MeeRijdRecords");
            //Create new instance of Meerijden and set values in it by creating a meerijden with createMeeRijd
            Meerijder m = createMeeRijden(1, 2, false);          // rit 1 van lid 1, meerijder lid 2
            m = createMeeRijden(1, 3, false);                      // rit 1 van lid 1, meerijder lid 3
            m = createMeeRijden(1, 4, true);                      // rit 1 van lid 1, meerijder lid 4
            m = createMeeRijden(2, 1, false);                      // rit 2 van lid 2, meerijder lid 1
            m = createMeeRijden(2, 3, true);                      // rit 2 van lid 2, meerijder lid 3
            m = createMeeRijden(2, 4, true);                      // rit 2 van lid 2, meerijder lid 4
            m = createMeeRijden(3, 1, false);                      // rit 3 van lid 3, meerijder lid 1
            m = createMeeRijden(3, 2, false);                      // rit 3 van lid 3, meerijder lid 2
 
            System.out.println("Inserting VriendSchapRecords");
            //Create new instance of Vriendschap and set values in it by creating a vriendschap with createVriendschap
            Vriendschap v = createVriendschap(1, 2, false);          
            v = createVriendschap(1, 3, false);                      
            v = createVriendschap(1, 4, true);                      
            v = createVriendschap(2, 3, false);                       
            v = createVriendschap(2, 4, true);                      
            v = createVriendschap(3, 4, true);                      
            
            System.out.println("Alle Done");
        } catch(Exception ex) {
            System.out.println(ex.getMessage());
        } finally {
        //     Actual contact insertion will happen at this step
            tx.commit();
            session.close();
        }       
           
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /*
             * TODO output your page here. You may use following sample code.
             */
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet fillDBController</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet fillDBController at " + request.getContextPath() + "</h1>");
            out.println("De DB is opnieuw gecreeerd aan de hand van jouw huidige hibernate schema.<br/> Daarna is hij met testdata gevult.<br/>");
            out.println("<br/>Ga naar de <a href=/PDL/index.jsp>index</a> pagina.<br/>");
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
    }
  

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

// even wat mooie create classe maken
// eerst Rol
    private Rol createRol(String rolNaam, String rolOmschrijving, 
            Boolean rolAdverteerder, Boolean rolBeheerder, Boolean rolGebruiker) throws Exception {
        Rol r;
        // Eerst kijken of Rol al bestaat
        Query q = session.createQuery("from Rol as rol where rol.rolNaam = '" + rolNaam + "'");
        r = (Rol) q.uniqueResult();
        if(null != r)
              return r;
        // anders wordt ie nu gemaakt
        r = new Rol();
        //RolId wordt door de DB automatische ge i++ st
        r.setRolId(0);
        r.setRolNaam(rolNaam);
        r.setRolOmschrijving(rolOmschrijving);
        r.setRolAdverteerder(rolAdverteerder);
        r.setRolBeheerder(rolBeheerder);
        r.setRolGebruiker(rolGebruiker);
        session.save(r);
        System.out.println("Rol: " + r.toString() );
        return r;
    }    

// Dan Lid
    private Lid createLid(int rolId, String lidLogin, String lidDisplaynaam, Date lidGeboortedatum, String lidProvincie) throws Exception {

        Date now = DateHelper.toDateWithTime("01/01/2012 00:00");
        Lid l;
        // Eerst kijken of Lid al bestaat
        Query q = session.createQuery("from Lid as lid where lid.lidLogin = '" + lidLogin + "'");
        l = (Lid) q.uniqueResult();
        if(null != l) 
                 return l;
        // anders wordt ie nu gemaakt
        l = new Lid();
        //RolId wordt door de DB automatische ge i++ st
        l.setLidId(0);
        l.setRolId(rolId);
        l.setLidLogin(lidLogin);
        l.setLidPassword(lidLogin);
        l.setLidDisplaynaam(lidDisplaynaam);
        l.setLidGeboortedatum(lidGeboortedatum);
        l.setLidProvincie(lidProvincie);
        l.setLidActivationkey(ActivationKey.generateActivationKey());
        l.setLidSpam(false);
        l.setLidDeleted(false);
        l.setLidActivated(true);
        l.setLidRegistered(now);
        session.save(l);
        System.out.println("Lid: " + l.toString() );
        return l;
    }  
    
    private Rit createRit(int lidId, Date ritDatum, Date ritTijd, String ritVanPlaats, 
            String ritNaarPlaats, int ritNrPlaatsen, boolean ritBagage, boolean ritPaffen, boolean ritDieren) throws Exception {
              
        Rit rt;
        // Eerst kijken of Rit al bestaat
        Query q = session.createQuery("from Rit as rit where rit.lidId = '" + lidId 
                + "' and rit.ritDatum = '" + DateHelper.toStringDate(ritDatum) 
                + "' and rit.ritTijd = '" + DateHelper.toStringTime(ritTijd) 
                + "'");
        rt = (Rit) q.uniqueResult();
        if(null != rt) {
              return rt;}
        // anders wordt ie nu gemaakt
        rt = new Rit();
        //RolId wordt door de DB automatische ge i++ st
        rt.setLidId(lidId);
        rt.setRitDatum(ritDatum);
        rt.setRitTijd(ritTijd);
        rt.setRitVanPlaats(ritVanPlaats);
        rt.setRitVanProvincie("Noord-Holland");
        rt.setRitNaarPlaats(ritNaarPlaats);
        rt.setRitNaarProvincie("Noord-Holland");
        rt.setRitNrPlaatsen(ritNrPlaatsen);
        rt.setRitBagage(ritBagage);
        rt.setRitPaffen(ritPaffen);
        rt.setRitDieren(ritDieren);
                
        session.save(rt);
        System.out.println("Rit: " + rt.toString() );
        return rt;
    } 
    
    private Meerijder createMeeRijden(int ritId, int lidId, boolean geAccepteerd) throws Exception {

        Meerijder m;              
        MeerijderId mId;
  
        // Eerst kijken of Meerijder al bestaat
        Query q = session.createQuery("FROM Meerijder AS mr WHERE mr.id.ritId = '" + ritId + "' AND mr.id.lidId = '" + lidId + "'");
        m = (Meerijder) q.uniqueResult();
        if(null != m)
                return m;
        // anders wordt ie nu gemaakt
        mId = new MeerijderId();
        mId.setRitId(ritId);
        mId.setLidId(lidId);
        m = new Meerijder(mId, geAccepteerd);
                
        session.save(m);
        System.out.println("Meerijden: " + m.toString() );
        return m;
    }     
  
    private Vriendschap createVriendschap(int lidIdMaster, int lidIdSlave, boolean geAccepteerd) throws Exception {
              
        Vriendschap v;
        VriendschapId vId;
        
        // Eerst kijken of Meerijder al bestaat
        Query q = session.createQuery("FROM Vriendschap AS vr WHERE vr.id.lidIdMaster = '" + lidIdMaster + "' AND vr.id.lidIdSlave = '" + lidIdSlave + "'");
        v = (Vriendschap) q.uniqueResult();
        if(null != v)
                return v;
        // anders wordt ie nu gemaakt
        vId = new VriendschapId();
        vId.setLidIdMaster(lidIdMaster);
        vId.setLidIdSlave(lidIdSlave);
        v = new Vriendschap(vId, geAccepteerd);
                
        session.save(v);
        System.out.println("Vriendschap: " + v.toString() );
        return v;
    }     
    
    
// ook Beoordeling_Categorie
// ook Beoordleing   
// ook Adverteinties_Tarief    
// ook Advertenties
// en ...    
    
        
}
